﻿/**
 @Name: Fly社区主入口
 */
        layui.define(['layer', 'laytpl', 'form', 'element', 'upload', 'util'], function (exports) {

            var $ = layui.jquery
                    , layer = layui.layer
                    , laytpl = layui.laytpl
                    , form = layui.form
                    , element = layui.element
                    , upload = layui.upload
                    , util = layui.util
                    , device = layui.device()
                    , DISABLED = 'layui-btn-disabled';

            //阻止IE7以下访问
            if (device.ie && device.ie < 8) {
                layer.alert('如果您非得使用 IE 浏览器访问Fly社区，那么请使用 IE8+');
            }

            layui.focusInsert = function (obj, str) {
                var result, val = obj.value;
                obj.focus();
                if (document.selection) { //ie
                    result = document.selection.createRange();
                    document.selection.empty();
                    result.text = str;
                } else {
                    result = [val.substring(0, obj.selectionStart), str, val.substr(obj.selectionEnd)];
                    obj.focus();
                    obj.value = result.join('');
                }
            };


            //数字前置补零
            layui.laytpl.digit = function (num, length, end) {
                var str = '';
                num = String(num);
                length = length || 2;
                for (var i = num.length; i < length; i++) {
                    str += '0';
                }
                return num < Math.pow(10, length) ? str + (num | 0) : num;
            };

            form.verify({
            username: function(value, item){ //value：表单的值、item：表单的DOM对象
              if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){
                return '用户名不能有特殊字符';
              }
              if(/(^\_)|(\__)|(\_+$)/.test(value)){
                return '用户名首尾不能出现下划线\'_\'';
              }
              if(/^\d+\d+\d$/.test(value)){
                return '用户名不能全为数字';
              }
            }

            //我们既支持上述函数式的方式，也支持下述数组的形式
            //数组的两个值分别代表：[正则匹配、匹配不符时的提示文字]
            ,pass: [
              /^[\S]{6,16}$/
              ,'密码必须6到16位，且不能出现空格'
            ] 
          });     

            var fly = {

                //Ajax
                json: function (url, data, success, options) {


                    console.log('url' + url)

                    var that = this, type = typeof data === 'function';

                    if (type) {
                        options = success
                        success = data;
                        data = {};
                    }

                    options = options || {};
                    // var index = layer.load(1, {shade: [0.2,'#000'] });
                    return $.ajax({
                        type: options.type || 'post',
                        dataType: options.dataType || 'json',
                        data: data,
                        url: url,
                        success: function (res) {
                            if (res.code === 0) {
                                success && success(res);
                            } else {
                                layer.msg(res.msg || res.code, {shift: 6});
                                options.error && options.error();
                            }
                        }, error: function (e) {
                            layer.msg('请求异常，请重试', {shift: 6});
                            options.error && options.error(e);
                        }, complete: function () {
                            // layer.close(index);
                        }
                    });
                }

                //计算字符长度
                , charLen: function (val) {
                    var arr = val.split(''), len = 0;
                    for (var i = 0; i < val.length; i++) {
                        arr[i].charCodeAt(0) < 299 ? len++ : len += 2;
                    }
                    return len;
                }

                , form: {}

                //简易编辑器
                , layEditor: function (options) {
                    var html = ['<div class="layui-unselect fly-edit">'
                                , '<span type="face" title="插入表情"><i class="iconfont icon-yxj-expression" style="top: 1px;"></i></span>'
                                , '<span type="picture" title="插入图片：img[src]"><i class="iconfont icon-tupian"></i></span>'
                                , '<span type="href" title="超链接格式：a(href)[text]"><i class="iconfont icon-lianjie"></i></span>'
                                , '<span type="code" title="插入代码或引用"><i class="iconfont icon-emwdaima" style="top: 1px;"></i></span>'
                                , '<span type="hr" title="插入水平线">hr</span>'
                                , '<span type="yulan" title="预览"><i class="iconfont icon-yulan1"></i></span>'
                                , '</div>'].join('');

                    var log = {}, mod = {
                        face: function (editor, self) { //插入表情
                            var str = '', ul, face = fly.faces;
                            for (var key in face) {
                                str += '<li title="' + key + '"><img src="' + face[key] + '"></li>';
                            }
                            str = '<ul id="LAY-editface" class="layui-clear">' + str + '</ul>';
                            layer.tips(str, self, {
                                tips: 3
                                , time: 0
                                , skin: 'layui-edit-face'
                            });
                            $(document).on('click', function () {
                                layer.closeAll('tips');
                            });
                            $('#LAY-editface li').on('click', function () {
                                var title = $(this).attr('title') + ' ';
                                layui.focusInsert(editor[0], 'face' + title);
                            });
                        }
                        , picture: function (editor) { //插入图片
                            layer.open({
                                type: 1
                                , id: 'fly-jie-upload'
                                , title: '插入图片'
                                , area: 'auto'
                                , shade: false
                                , area: '465px'
                                , fixed: false
                                , offset: [
                                    editor.offset().top - $(window).scrollTop() + 'px'
                                            , editor.offset().left + 'px'
                                ]
                                , skin: 'layui-layer-border'
                                , content: ['<ul class="layui-form layui-form-pane" style="margin: 20px;">'
                                            , '<li class="layui-form-item">'
                                            , '<label class="layui-form-label">URL</label>'
                                            , '<div class="layui-input-inline">'
                                            , '<input required name="image" placeholder="支持直接粘贴远程图片地址" value="" class="layui-input">'
                                            , '</div>'
                                            , '<button type="button" class="layui-btn layui-btn-primary" id="uploadImg"><i class="layui-icon">&#xe67c;</i>上传图片</button>'
                                            , '</li>'
                                            , '<li class="layui-form-item" style="text-align: center;">'
                                            , '<button type="button" lay-submit lay-filter="uploadImages" class="layui-btn">确认</button>'
                                            , '</li>'
                                            , '</ul>'].join('')
                                , success: function (layero, index) {
                                    var image = layero.find('input[name="image"]');

                                    //执行上传实例
                                    upload.render({
                                        elem: '#uploadImg'
                                        , url: layui.baseUrl() + '/member/upload_img/'
                                        , size: 200
                                        , done: function (res) {
                                            if (res.code == 0) {
                                                image.val(res.data.url);
                                            } else {
                                                layer.msg(res.msg, {icon: 5});
                                            }
                                        }
                                    });

                                    form.on('submit(uploadImages)', function (data) {
                                        var field = data.field;
                                        if (!field.image)
                                            return image.focus();
                                        layui.focusInsert(editor[0], 'img[' + field.image + '] ');
                                        layer.close(index);
                                    });
                                }
                            });
                        }
                        , href: function (editor) { //超链接
                            layer.prompt({
                                title: '请输入合法链接'
                                , shade: false
                                , fixed: false
                                , id: 'LAY_flyedit_href'
                                , offset: [
                                    editor.offset().top - $(window).scrollTop() + 'px'
                                            , editor.offset().left + 'px'
                                ]
                            }, function (val, index, elem) {
                                if (!/^http(s*):\/\/[\S]/.test(val)) {
                                    layer.tips('这根本不是个链接，不要骗我。', elem, {tips: 1})
                                    return;
                                }
                                layui.focusInsert(editor[0], ' a(' + val + ')[' + val + '] ');
                                layer.close(index);
                            });
                        }
                        , code: function (editor) { //插入代码
                            layer.prompt({
                                title: '请贴入代码或任意文本'
                                , formType: 2
                                , maxlength: 10000
                                , shade: false
                                , id: 'LAY_flyedit_code'
                                , area: ['800px', '360px']
                            }, function (val, index, elem) {
                                layui.focusInsert(editor[0], '[pre]\n' + val + '\n[/pre]');
                                layer.close(index);
                            });
                        }
                        , hr: function (editor) { //插入水平分割线
                            layui.focusInsert(editor[0], '[hr]');
                        }
                        , yulan: function (editor) { //预览
                            var content = editor.val();

                            content = /^\{html\}/.test(content)
                                    ? content.replace(/^\{html\}/, '')
                                    : fly.content(content);

                            layer.open({
                                type: 1
                                , title: '预览'
                                , shade: false
                                , area: ['100%', '100%']
                                , scrollbar: false
                                , content: '<div class="detail-body" style="margin:20px;">' + content + '</div>'
                            });
                        }
                    };

                    layui.use('face', function (face) {
                        options = options || {};
                        fly.faces = face;
                        $(options.elem).each(function (index) {
                            var that = this, othis = $(that), parent = othis.parent();
                            parent.prepend(html);
                            parent.find('.fly-edit span').on('click', function (event) {
                                var type = $(this).attr('type');
                                mod[type].call(that, othis, this);
                                if (type === 'face') {
                                    event.stopPropagation()
                                }
                            });
                        });
                    });

                }

                , escape: function (html) {
                    return String(html || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
                            .replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/'/g, '&#39;').replace(/"/g, '&quot;');
                }

                //内容转义
                , content: function (content) {
                    //支持的html标签
                    var html = function (end) {
                        return new RegExp('\\n*\\[' + (end || '') + '(pre|hr|div|span|p|table|thead|th|tbody|tr|td|ul|li|ol|li|dl|dt|dd|h2|h3|h4|h5)([\\s\\S]*?)\\]\\n*', 'g');
                    };
                    content = fly.escape(content || '') //XSS
                            .replace(/img\[([^\s]+?)\]/g, function (img) {  //转义图片
                                return '<img src="' + img.replace(/(^img\[)|(\]$)/g, '') + '">';
                            }).replace(/@(\S+)(\s+?|$)/g, '@<a href="javascript:;" class="fly-aite">$1</a>$2') //转义@
                            .replace(/face\[([^\s\[\]]+?)\]/g, function (face) {  //转义表情
                                var alt = face.replace(/^face/g, '');
                                return '<img alt="' + alt + '" title="' + alt + '" src="' + fly.faces[alt] + '">';
                            }).replace(/a\([\s\S]+?\)\[[\s\S]*?\]/g, function (str) { //转义链接
                        var href = (str.match(/a\(([\s\S]+?)\)\[/) || [])[1];
                        var text = (str.match(/\)\[([\s\S]*?)\]/) || [])[1];
                        if (!href)
                            return str;
                        var rel = /^(http(s)*:\/\/)\b(?!(\w+\.)*(sentsin.com|layui.com))\b/.test(href.replace(/\s/g, ''));
                        return '<a href="' + href + '" target="_blank"' + (rel ? ' rel="nofollow"' : '') + '>' + (text || href) + '</a>';
                    }).replace(html(), '\<$1 $2\>').replace(html('/'), '\</$1\>') //转移HTML代码
                            .replace(/\n/g, '<br>') //转义换行   
                    return content;
                }

                //发送验证码
                , sendAuthCode: function (options) {
                    options = $.extend({
                        seconds: 60
                        , elemEmail: $('#L_email')
                        , elemVercode: $('#L_vercode')
                        , elemImagecode: $('#L_imagecode')
                    }, options);

                    var seconds = options.seconds
                            , btn = $(options.elem)
                            , token = null
                            , timer, countDown = function (loop) {
                                seconds--;
                                if (seconds < 0) {
                                    btn.removeClass(DISABLED).html('获取验证码');
                                    seconds = options.seconds;
                                    clearInterval(timer);
                                } else {
                                    btn.addClass(DISABLED).html(seconds + '秒后可重新获取');
                                }

                                if (!loop) {
                                    timer = setInterval(function () {
                                        countDown(true);
                                    }, 1000);
                                }
                            };

                    btn.on('click', function () {
                        var elemEmail = options.elemEmail
                                , value = elemEmail.val() //邮箱
                                , elemImagecode = options.elemImagecode
                                , valueImage = elemImagecode.val();

                        if (seconds !== options.seconds)
                            return;

                        if (!/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/.test(value)) {
                            elemEmail.focus();
                            return layer.msg('请输入正确的邮箱');
                        }


                        if (!valueImage) {
                            elemImagecode.focus();
                            return layer.msg('请输入图形验证码');
                        }


                        fly.json(layui.baseUrl() + '/everyone/email_code_send', {
                            email: value
                            , imagecode: valueImage
                        }, function (res) {
                            layer.msg('验证码已发送至你的邮箱，请注意查收', {
                                icon: 1
                                , shade: 0
                            });
                            options.elemVercode.focus();
                            countDown();
                        });

                    });

                }

                //新消息通知
                , newmsg: function () {
                    var elemUser = $('.fly-nav-user');
                    if (layui.cache.user.uid !== -1 && elemUser[0]) {
                        fly.json(layui.baseUrl() + '/message/nums/', {
                            _: new Date().getTime()
                        }, function (res) {
                            if (res.code === 0 && res.count > 0) {
                                var msg = $('<a class="fly-nav-msg" href="javascript:;">' + res.count + '</a>');
                                elemUser.append(msg);
                                msg.on('click', function () {
                                    fly.json(layui.baseUrl() + '/message/read', {}, function (res) {
                                        if (res.code === 0) {
                                            location.href = layui.baseUrl() + '/member/message/';
                                        }
                                    });
                                });
                                layer.tips('你有 ' + res.count + ' 条未读消息', msg, {
                                    tips: 3
                                    , tipsMore: true
                                    , fixed: true
                                });
                                msg.on('mouseenter', function () {
                                    layer.closeAll('tips');
                                })
                            }
                        });
                    }
                    return arguments.callee;
                }
            };



            //签到
            var tplSignin = ['{{# if(d.days){ }}'
                        , '<button class="layui-btn layui-btn-disabled" id="LAY_signin">今日已签到</button>'
                        , '<span>获得了<cite>{{ d.points }}</cite>积分</span>'
                        , '{{# } else { }}'
                        , '<button class="layui-btn layui-btn-danger" id="LAY_signin">今日签到</button>'
                        , '<span>可获得<cite>{{ d.points }}</cite>积分</span>'
                        , '{{# } }}'].join('')
                    , tplSigninDay = '已连续签到<cite>{{ d.days }}</cite>天'

                    , signRender = function (data) {
                        laytpl(tplSignin).render(data, function (html) {
                            elemSigninMain.html(html);
                        });
                        laytpl(tplSigninDay).render(data, function (html) {
                            elemSigninDays.html(html);
                        });
                    }

            , elemSigninHelp = $('#LAY_signinHelp')
                    , elemSigninTop = $('#LAY_signinTop')
                    , elemSigninMain = $('.fly-signin-main')
                    , elemSigninDays = $('.fly-signin-days');

// 异步加载签到（暂不用）
//            if (elemSigninMain[0]) {                
//                fly.json(layui.baseUrl() + '/member/sign_status', function (res) {
//                    if (!res.data)
//                        return;
//                    signRender.token = res.data.token;
//                    signRender(res.data);
//                });
//            }        


            $('body').on('click', '#LAY_signin', function () {
                var othis = $(this);
                if (othis.hasClass(DISABLED))
                    return;

                fly.json(layui.baseUrl() + '/member/sign_day', {
                    token: signRender.token || 1
                }, function (res) {

                    signRender(res.data);

                }, {
                    error: function () {
                        othis.removeClass(DISABLED);
                    }
                });
                othis.addClass(DISABLED);
            });


            $("#LAY_signin").hover(function () {
                if ($("#LAY_signin").hasClass(DISABLED)) {
                    $("#sign_box").show();
                }
            }, function () {
                $("#sign_box").hide();
            })

            //签到活跃榜
            var tplSigninTop = ['{{# layui.each(d.data, function(index, item){ }}'
                        , '<li>'
                        , '<a href="/u/{{item.uid}}" target="_blank">'
                        , '<img src="{{item.avatar}}">'
                        , '<cite class="fly-link">{{item.nickname}}</cite>'
                        , '</a>'
                        , '{{# var date = new Date(item.time * 1000); if(d.index < 2){ }}'
                        , '<span class="fly-grey">签到于 {{ layui.laytpl.digit(date.getHours()) + ":" + layui.laytpl.digit(date.getMinutes()) + ":" + layui.laytpl.digit(date.getSeconds()) }}</span>'
                        , '{{# } else { }}'
                        , '<span class="fly-grey">已连续签到 <i>{{ item.days }}</i> 天</span>'
                        , '{{# } }}'
                        , '</li>'
                        , '{{# }); }}'
                        , '{{# if(d.data.length === 0) { }}'
                        , '{{# if(d.index < 2) { }}'
                        , '<li class="fly-none fly-grey">今天还没有人签到</li>'
                        , '{{# } else { }}'
                        , '<li class="fly-none fly-grey">还没有签到记录</li>'
                        , '{{# } }}'
                        , '{{# } }}'].join('');

            elemSigninTop.on('click', function () {
                var loadIndex = layer.load(1, {shade: 0.8});
                fly.json(layui.baseUrl() + '/everyone/sign_top', function (res) { //实际使用，请将 url 改为真实接口
                    var tpl = $(['<div class="layui-tab layui-tab-brief" style="margin: 5px 0 0;">'
                                , '<ul class="layui-tab-title">'
                                , '<li class="layui-this">最新签到</li>'
                                , '<li>今日最快</li>'
                                , '<li>总签到榜</li>'
                                , '</ul>'
                                , '<div class="layui-tab-content fly-signin-list" id="LAY_signin_list">'
                                , '<ul class="layui-tab-item layui-show"></ul>'
                                , '<ul class="layui-tab-item">2</ul>'
                                , '<ul class="layui-tab-item">3</ul>'
                                , '</div>'
                                , '</div>'].join(''))
                            , signinItems = tpl.find('.layui-tab-item');

                    layer.close(loadIndex);

                    layui.each(signinItems, function (index, item) {
                        var html = laytpl(tplSigninTop).render({
                            data: res.data[index]
                            , index: index
                        });
                        $(item).html(html);
                    });

                    layer.open({
                        type: 1
                        , title: '签到活跃榜 - TOP 20'
                        , area: '300px'
                        , shade: 0.8
                        , shadeClose: true
                        , id: 'layer-pop-signintop'
                        , content: tpl.prop('outerHTML')
                    });

                }, {type: 'get'});
            });

            //回帖榜
            var tplReply = ['{{# layui.each(d.data, function(index, item){ }}'
                        , '<dd>'
                        , '<a href="/u/{{item.uid}}">'
                        , '<img src="{{item.user.avatar}}">'
                        , '<cite>{{item.user.username}}</cite>'
                        , '<i>{{item["count(*)"]}}次回答</i>'
                        , '</a>'
                        , '</dd>'
                        , '{{# }); }}'].join('')
                    , elemReply = $('#LAY_replyRank');

            if (elemReply[0]) {
                /*
                 fly.json('/top/reply/', {
                 limit: 20
                 }, function(res){
                 var html = laytpl(tplReply).render(res);
                 elemReply.find('dl').html(html);
                 });
                 */
            }

            //相册
            if ($(window).width() > 750) {
                layer.photos({
                    photos: '.photos'
                    , zIndex: 9999999999
                    , anim: -1
                });
            } else {
                $('body').on('click', '.photos img', function () {
                    window.open(this.src);
                });
            }

            //搜索
            $('.fly-search').on('click', function () {
                layer.open({
                    type: 1
                    , title: false
                    , closeBtn: false
                            //,shade: [0.1, '#fff']
                    , shadeClose: true
                    , maxWidth: 10000
                    , skin: 'fly-layer-search'
                    , content: ['<form action="http://cn.bing.com/search">'
                                , '<input autocomplete="off" placeholder="搜索内容，回车跳转" type="text" name="q">'
                                , '</form>'].join('')
                    , success: function (layero) {
                        var input = layero.find('input');
                        input.focus();

                        layero.find('form').submit(function () {
                            var val = input.val();
                            if (val.replace(/\s/g, '') === '') {
                                return false;
                            }
                            input.val('site:layui.com ' + input.val());
                        });
                    }
                })
            });

            //执行发送验证码
            fly.sendAuthCode({
                elem: '#FLY-getvercode'
            });

            //新消息通知
            fly.newmsg();

            //发送激活邮件
            fly.activate = function (email) {
                fly.json(layui.baseUrl() + '/member/activate_retry', {}, function (res) {
                    if (res.code === 0) {
                        layer.alert('已成功将激活链接发送到了您的邮箱，接受可能会稍有延迟，请注意查收。', {
                            icon: 1
                        });
                    }
                });
            };
            $('#LAY-activate').on('click', function () {
                fly.activate($(this).attr('email'));
            });


            fly.messageSend = function () {
                var sns = $('.fly-sns');
                layer.prompt({title: '发送私信', formType: 2}, function (text, index) {
                    layer.close(index);
                    fly.json(layui.baseUrl() + '/message/send', {message: text, recv_id: sns.data('id')}, function (res) {
                        if (res.code === 0) {
                            layer.msg('发送成功');
                        }
                    });
                });
            }

            fly.followAdd = function () {

                fly.json(layui.baseUrl() + '/member/follow_add', {member_id: $('.fly-sns').data('id')}, function (res) {
                    if (res.code === 0) {
                        if (res.data == 1) {
                            layer.msg('关注成功');
                            $('.fly_follow').html('已关注')
                        } else {
                            layer.msg('取关成功');
                            $('.fly_follow').html('关注TA')
                        }
                    }
                });
            }


            $('.fly_message').on('click', function () {
                fly.messageSend();
            });

            $('.fly_follow').on('click', function () {
                fly.followAdd();
            });




            //点击@
            $('body').on('click', '.fly-aite', function () {
                var othis = $(this), text = othis.text();
                if (othis.attr('href') !== 'javascript:;') {
                    return;
                }
                text = text.replace(/^@|（[\s\S]+?）/g, '');
                othis.attr({
                    href: '/jump?username=' + text
                    , target: '_blank'
                });
            });

            //表单提交
            form.on('submit(*)', function (data) {
                var action = $(data.form).attr('action'), button = $(data.elem);
                fly.json(action, data.field, function (res) {
                    var end = function () {
                        if (res.url) {
                            location.href = res.url;
                        } else {
                            // fly.form[action || button.attr('key')](data.field, data.form);
                        }
                    };
                    if (res.code == 0) {
                        button.attr('alert') ? layer.alert(res.msg, {
                            icon: 1,
                            time: 10 * 1000,
                            end: end
                        }) : end();
                    }
                });
                return false;
            });


            //加载特定模块
            if (layui.cache.page && layui.cache.page !== 'index') {
                var extend = {};
                extend[layui.cache.page] = layui.cache.page;
                layui.extend(extend);
                layui.use(layui.cache.page);
            }

            //加载IM
            if (!device.android && !device.ios) {
                //layui.use('im');
            }

            //加载编辑器
            fly.layEditor({
                elem: '.fly-editor'
            });

            //手机设备的简单适配
            var treeMobile = $('.site-tree-mobile')
                    , shadeMobile = $('.site-mobile-shade')

            treeMobile.on('click', function () {
                $('body').addClass('site-mobile');
            });

            shadeMobile.on('click', function () {
                $('body').removeClass('site-mobile');
            });

            //获取统计数据
            $('.fly-handles').each(function () {
                var othis = $(this);
                $.get('/api/handle?alias=' + othis.data('alias'), function (res) {
                    othis.html('（下载量：' + res.number + '）');
                })
            });

            //固定Bar
            util.fixbar({
                bar1: '&#xe642;'
                , bgcolor: '#009688'
                , click: function (type) {
                    if (type === 'bar1') {
                        location.href = layui.baseUrl() + '/member/thread_add';
                    }
                }
            });

            exports('fly', fly);

        });

